interface Person {
  readonly name?: string; // 只读属性: 被赋值后不可以修改
  age: number;
  sex?: string; // 可选属性
  hobbit: (message: string) => void;
  charactor?: () => void;
  [propName: string]: any; // 这个属性的名字为字符串类型, 值为任意类型(动态属性名)
  say?(): string; // say函数返回值为字符串类型
}

/*
  这里Person1可以直接代表stirng，而interface没有这样的能力, 这就是type和interface的区别
    type Person1 = string; 
    type Person1 = {
      name: string
    }
*/

const person: Person = {
  name: '张三',
  age: 17,
  hobbit: (message = '123') => {
    console.log(message);
  },
  say() {
    return '123';
  },
  id: 0
}

class User implements Person {
  age = 17;
  hobbit(message: string) {
    return message;
  }
}